package XML与JSON.使用DOM;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashMap;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.NamedNodeMap;
import org.xml.sax.SAXException;

/*
public class 读取DOM格式XML {
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//		URL resource = 读取DOM格式XML.class.getResource("");
//      String absolutePath = resource.getPath();
//		//String str=读取DOM格式XML.class.getResource("") + "book.xml";
//		System.out.println(file.getAbsolutePath());	
		File file = new File("src\\main\\java\\XML与JSON\\student.xml");
		System.out.println(file.exists());

		// InputStream input = 读取DOM格式XML.class.getResourceAsStream(file);
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		Document doc = db.parse(file);
		doc.getDocumentElement().normalize();
		//doc.normalize();//对Document对象调用normalize()，可以去掉XML文档中作为格式化内容的空白而映射在DOM树中的不必要的Text Node对象
		String rootName = doc.getDocumentElement().getTagName();
		System.out.println("根节点: " + rootName);

		printNode(doc.getDocumentElement(), 0);
	}

	static void printNode(Node n, int indent) {
		for (int i = 0; i < indent; i++) {
			System.out.print(' ');// indent:缩进
		}
		if(n.getNodeName()!="#text")
			System.out.println(n.getNodeName()+"……"+n.getNodeValue());

		switch (n.getNodeType()) {
			case Node.DOCUMENT_NODE: // Document节点
				System.out.println("Document: " + n.getNodeName());
				break;
			case Node.ELEMENT_NODE: // 元素节点
				System.out.println("Element: " + n.getNodeName());
				break;
			case Node.TEXT_NODE: // 文本
				System.out.println("Text: " + n.getNodeName() + " = " + n.getNodeValue());
				break;
			case Node.ATTRIBUTE_NODE: // 属性
				System.out.println("Attr: " + n.getNodeName() + " = " + n.getNodeValue());
				break;
			default: // 其他
				System.out.println("NodeType: " + n.getNodeType() + ", NodeName: " + n.getNodeName());
		}
		for (Node child = n.getFirstChild(); child != null; child = child.getNextSibling()) {
			printNode(child, indent + 3);
		}
	}
}
*/
/*
<?xml version="1.0" encoding="UTF-8" ?>
<book id="1">
    <name>Java核心技术</name>
    <author>Cay S. Horstmann</author>
    <isbn lang="CN">1234567</isbn>
    <tags>
        <tag>Java</tag>
        <tag>Network</tag>
    </tags>
    <pubDate/>
</book>
*/

//public class 读取DOM格式XML {
//
//   public static void main(String argv[]) throws SAXException,
//           IOException, ParserConfigurationException {
//
//       File xmlFile = new File("src\\main\\java\\XML与JSON\\使用DOM\\continents.xml");
//
//       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//       DocumentBuilder dBuilder = factory.newDocumentBuilder();
//       Document doc = dBuilder.parse(xmlFile);
//
//       doc.getDocumentElement().normalize();
//
//       System.out.println("Root element: " + doc.getDocumentElement().getNodeName());
//       printNode(doc.getDocumentElement(), 0);
//   }
//   static void printNode(Node n, int indent) {
//   	for (int i = 0; i < indent; i++) {
//			System.out.print(' ');// indent:缩进
//		}
//   	System.out.println("\nCurrent Element: " + n.getNodeName());
//   	System.out.print("x-----" + n.getNodeType());
//   	switch (n.getNodeType()) {
//			case Node.DOCUMENT_NODE: // Document节点   #9
//				System.out.println("Document: " + n.getNodeName());
//				break;
//			case Node.ELEMENT_NODE: // 元素节点  #1
//				Element elem = (Element) n;
//            NamedNodeMap attrs=elem.getAttributes();
//            for (int i=0;i<attrs.getLength();i++) {
//               Attr attr=(Attr) attrs.item(i);
//               System.out.print(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
//            }
//				break;
//			case Node.TEXT_NODE: // 文本  #3
//				if (n.getNodeName()!="#text")
//					System.out.println("Text: " + n.getNodeName() + " = " + n.getNodeValue());
//				System.out.println(n.getNodeValue()==null);
//				
//				break;
//			case Node.ATTRIBUTE_NODE: // 属性  #2
//				System.out.println("Attr: " + n.getNodeName() + " = " + n.getNodeValue());
//				break;
//			default: // 其他
//				System.out.println("NodeType: " + n.getNodeType() + ", NodeName: " + n.getNodeName());
//		}
//   	
//      for (Node child = n.getFirstChild(); child != null; child = child.getNextSibling()) {
//      	printNode(child, indent + 3);
//      }
//   }
//}
/*
<?xml version="1.0" encoding="UTF-8"?>
<users>
    <user id="1">
        <firstname>Peter</firstname>
        <lastname>Brown</lastname>
        <occupation>programmer</occupation>
    </user>
    <user id="2">
        <firstname>Martin</firstname>
        <lastname>Smith</lastname>
        <occupation>accountant</occupation>
    </user>
    <user id="3">
        <firstname>Lucy</firstname>
        <lastname>Gordon</lastname>
        <occupation>teacher</occupation>
    </user>    
</users>
*/
import java.io.*;//导入java.io包下的所有类
import org.w3c.dom.*;//使用org.w3c.dom操作XML文件 
import org.xml.sax.SAXException;//使用org.xml.sax.SAXException读取文件
import javax.xml.parsers.*; //导入 javax.xml.parsers包下的所有类
public class 读取DOM格式XML{//类名
    public static void main(String[] args){//程序主入口函数，带命令行参数
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建DOM模式的解析器工厂对象
        try{//try代码块，当发生异常时会转到catch代码块中
            DocumentBuilder builder=factory.newDocumentBuilder();//得到一个DOM解析器对象  
            Document doc=builder.parse(new File("src\\main\\java\\XML与JSON\\student.xml");//打开指定路径下的xml文件 
            String rootName = doc.getDocumentElement().getTagName();
            NodeList nl=doc.getElementsByTagName("hang");//获得<hang>文件的值  
            for (int i=0; i < nl.getLength(); i++){//for循环的条件
                System.out.println(doc.getElementsByTagName("产品唯一ID").item(i)
                        .getFirstChild().getNodeValue());//获取“产品唯一ID”的信息   
                System.out.println(doc.getElementsByTagName("通用名").item(i)  
                        .getFirstChild().getNodeValue());//获取“通用名”的信息   
                System.out.println(doc.getElementsByTagName("商品名").item(i)  
                        .getFirstChild().getNodeValue());//获取“商品名”的信息   
                System.out.println(doc.getElementsByTagName("剂型").item(i)  
                        .getFirstChild().getNodeValue());//获取“剂型”的信息 
                System.out.println(doc.getElementsByTagName("批准文号").item(i)  
                        .getFirstChild().getNodeValue());//获取“批准文号”的信息 
                System.out.println(doc.getElementsByTagName("规格").item(i)  
                        .getFirstChild().getNodeValue());//获取“规格”的信息 
                System.out.println(doc.getElementsByTagName("包装说明").item(i)  
                        .getFirstChild().getNodeValue());//获取“包装说明”的信息 
                System.out.println(doc.getElementsByTagName("包装单位").item(i)  
                        .getFirstChild().getNodeValue());//获取“包装单位”的信息 
                System.out.println(doc.getElementsByTagName("生产企业").item(i)  
                        .getFirstChild().getNodeValue());//获取“生产企业”的信息 
                System.out.println(doc.getElementsByTagName("大包装转换比").item(i)  
                        .getFirstChild().getNodeValue());//获取“大包装转换比”的信息 
                System.out.println(doc.getElementsByTagName("中包装转换比").item(i)  
                        .getFirstChild().getNodeValue());//获取“中包装转换比”的信息 
                System.out.println(doc.getElementsByTagName("备注").item(i)  
                        .getFirstChild().getNodeValue());//获取“备注”的信息 
                System.out.println(doc.getElementsByTagName("库存").item(i)  
                        .getFirstChild().getNodeValue());//获取“库存”的信息 
                System.out.println(doc.getElementsByTagName("供应价").item(i)  
                        .getFirstChild().getNodeValue());//获取“供应价”的信息 
                System.out.println(doc.getElementsByTagName("是否上架").item(i)  
                        .getFirstChild().getNodeValue());//获取“是否上架”的信息 
                System.out.println();//输出空字符进行格式调整
                }
            }
        catch (ParserConfigurationException e){//当try代码块有异常时转到catch代码块
            e.printStackTrace();//在命令行打印异常信息出错的位置及原因
            }
        catch (SAXException e){//当try代码块有异常时转到catch代码块
            e.printStackTrace();//在命令行打印异常信息出错的位置及原因
            }
        catch (IOException e){//当try代码块有异常时转到catch代码块
            e.printStackTrace();//在命令行打印异常信息出错的位置及原因  
            }
      }
} 
